/***********************************************************************
*
* Copyright (c) 2012-2025 Barbara Geller
* Copyright (c) 2012-2025 Ansel Sermersheim
*
* Copyright (c) 2015 The Qt Company Ltd.
* Copyright (c) 2012-2016 Digia Plc and/or its subsidiary(-ies).
* Copyright (c) 2008-2012 Nokia Corporation and/or its subsidiary(-ies).
*
* This file is part of CopperSpice.
*
* CopperSpice is free software. You can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* version 2.1 as published by the Free Software Foundation.
*
* CopperSpice is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* https://www.gnu.org/licenses/
*
***********************************************************************/

#ifndef QMEDIASERVICE_H
#define QMEDIASERVICE_H

#include <qobject.h>
#include <qstringlist.h>
#include <qmediacontrol.h>

class QMediaServicePrivate;

class Q_MULTIMEDIA_EXPORT QMediaService : public QObject
{
   MULTI_CS_OBJECT(QMediaService)

 public:
   ~QMediaService();

   virtual QMediaControl *requestControl(const QString &name) = 0;

   template <typename T>
   T requestControl() {
      if (QMediaControl *control = requestControl(qobject_interface_iid<T>())) {
         if (T typedControl = dynamic_cast<T>(control)) {
            return typedControl;
         }

         releaseControl(control);
      }

      return nullptr;
   }

   virtual void releaseControl(QMediaControl *control) = 0;

 protected:
   QMediaService(QObject *parent);
   QMediaService(QMediaServicePrivate &dd, QObject *parent);

   QMediaServicePrivate *d_ptr;

 private:
   Q_DECLARE_PRIVATE(QMediaService)
};

#endif

